#!/bin/sh

# fn : Flutter & Android & iOS 的构建帮助工具
version="0.0.1"
# 需要检查的安装软件
app_list=(flutter git python3 pip3 ruby brew pod java gradle adb lqkfn)
# 环境配置
# 检查系统 macOS 需要检查 Xcode 安装; Windows / Linux 需要检查 VSCode 和 Android Studio 
# 开发工具 Android Studio / VSCode / XCode
# 运行环境 Chrome

# Flutter SDK 根目录
flutter_sdk=""
# Android SDK 根目录
android_sdk=""



function help(){
    "
    export HOMEBREW_API_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/api #brew.idayer.com
    export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottles #brew.idayer.com

    export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles #ckbrew
    eval $(/usr/local/Homebrew/bin/brew shellenv) #ckbrew

    # PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

    # gem
    export GEM_HOME=$HOME/.gem
    export PATH=$GEM_HOME/bin:$PATH

    # ruby
    export RUBY_ROOT=/usr/local/Cellar/ruby/3.2.1
    export PATH=$RUBY_ROOT/bin:$PATH

    # cocoapods
    export COCOAPODS_ROOT=/Users/mac/.gem/ruby/3.2.0
    export PATH=$COCOAPODS_ROOT/bin:$PATH

    # Java
    export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
    export PATH=$JAVA_HOME/bin:$PATH

    # flutter
    export PUB_HOSTED_URL=https://pub.flutter-io.cn
    export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

    export FLUTTER_ROOT=/Users/mac/sdk/flutter
    export DART_ROOT=/Users/mac/sdk/flutter/bin/cache/dart-sdk
    export PATH=$FLUTTER_ROOT/bin:$DART_ROOT/bin:$PATH

    # android
    export ANDROID_ROOT=/Users/mac/sdk/Android
    export PLATFORM_TOOLS=$ANDROID_ROOT/platform-tools
    export BUILD_TOOLS=$ANDROID_ROOT/build-tools/33.0.2
    export PLATFORMS=$ANDROID_ROOT/platforms/android-33-ext5
    export TOOLS=$ANDROID_ROOT/tools
    export TOOLS_BIN=$TOOLS/bin
    export NDK_ROOT=$ANDROID_ROOT/ndk/25.2.9519653
    export CMD_TOOLS=$ANDROID_ROOT/cmdline-tools/latest/bin

    export PATH=$PLATFORM_TOOLS:$BUILD_TOOLS:$PLATFORMS:$TOOLS:$TOOLS_BIN:$NDK_ROOT:$CMD_TOOLS:$PATH

    # gradle
    export GRADLE_ROOT=/Users/mac/Downloads/gradle-8.0.2

    export PATH=$GRADLE_ROOT/bin:$PATH
    "

    echo "========================================"
    echo "系统信息"
    echo "------------------------------------------------------------"
    echo "$(sw_vers)"
    echo "------------------------------------------------------------"

    echo "========================================"
    echo "Flutter"
    echo "----------------------------------------"
    echo "$(flutter --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "Git"
    echo "----------------------------------------"
    echo "$(git --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "Python"
    echo "----------------------------------------"
    echo "$(python3 --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "pip"
    echo "----------------------------------------"
    echo "$(pip3 --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "Ruby"
    echo "----------------------------------------"
    echo "$(ruby --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "brew"
    echo "----------------------------------------"
    echo "$(brew --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "pod"
    echo "----------------------------------------"
    echo "$(pod --version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "xcodebuild"
    echo "----------------------------------------"
    echo "$(xcodebuild -version)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "gradle"
    echo "----------------------------------------"
    echo "$(gradle -v)"
    echo "----------------------------------------"
    echo ""

    echo "========================================"
    echo "adb"
    echo "----------------------------------------"
    echo "$(adb --version)"
    echo "----------------------------------------"
    echo ""

    # 检查 lqk 命令
    commod="$(which lqkfn)"
    echo "$?"
    if [ commod = "0" ]
    then
        echo "========================================"
        echo "lqkfn"
        echo "----------------------------------------"
        echo "$(lqkfn --version)"
        echo "----------------------------------------"
    fi

}

:<<1
1231341
1

# :<<n
# 111111111111
# n

# 定义参数
function fnHelp(){
    echo ""
    echo "=================================="
    echo "Flutter 原生混合开发 帮助脚本"
    echo "=================================="
    echo "可执行命令commond"
    echo "------------------------------"
    echo "fnCreate 创建工程"
    echo "fnInit 初始化工程 功能同 fnCreate 需要在空目录中执行"
    echo "fnSync 同步工程"
    echo "fnCheckout 切换分支"
    echo "fnBuild 编译工程 先同步 flutter 工程引用"
    echo "fnRun 编译并运行工程"
    echo "fnAssemble 打包 生成aar / apk / ipr 文件"
    echo ""
    echo "=============================="
    echo "设置项目参数"
    echo "------------------------------"
    echo "--help, -h 显示帮助文档"
    echo "--version, -v 显示版本信息"

    echo "--project, -p 工程名称"
    echo "--org"
    echo "--package-name 包名"
    echo ""

    echo "--android-project  Android 工程名称"
    echo "--android-agp 使用  AndroidGradlePlugin 版本"
    echo "--android-min-sdk  Android 最小 sdk 版本"
    echo "--android-target-sdk Android 开发mu"
    echo "--android-compile-sdk"
    echo "--android-build-tools"
    echo "--android-version-name"
    echo "--android-version-code"
    echo "--android-kotlin"
    echo "--android-sign Android 签名配置 文件位置,密码,别名,别名密码"
    echo "--android-use-compose 应用模版: 普通xml / compose"
    echo ""

    echo "--ios-project iOS 工程名称"
    echo "--ios-target"
    echo "--ios-bundleid iOS 包名"
    echo "--ios-min-sdk"
    echo "--ios-version-name"
    echo "--ios-version-code"

    echo "=============================="
    echo "开始创建 Flutter & Native 工程"
    echo "------------------------------"
    echo "1. 创建 Flutter 工程"
    echo "2. 创建 Android 工程"
    echo "3. 创建 iOS 工程"
    echo "=============================="
}


# shell 基本使用
function shellHelp()
{
    # 解释器: sh 解析 .sh 文件 -> /bin/sh test.sh 直接运行 shell 脚本
    # 脚本注意点: 所有变量, 函数, 在使用前必须事先定义好, 类似 C/C++ 从上到下的编译 , 函数定义后内容不能为空, 会报错

    # 基本数据类型: shell 脚本中 基本只使用 字符串 和 intger , 数组(字符串和intger) 三种类型的数据类型 数组可以有不同类型的成员
    # 变量类型: 环境变量 > 全局变量 > 局部变量 > 临时变量
    #   环境变量: 在当前窗口 使用 export XXX=xxx 的形式定义出来的变量, 所有shell脚本皆可使用,
    #   全局变量: 当前shell 可以使用,
    #   局部变量: 函数中定义出来的变量, 临时
    # 变量: XXX=xxx 定义变量 = 号左右不能有空格 有空格的 是在 判断是否相等 命名规则, 只能使用 英文,数字,_ 英文下划线, 首个字符不能是数字
    # 变量: 数组 XXX=(xxx1 xxx2 xxx3 ... xxxn) 数据中间使用 空格分割 或者换行分割
    # 变量(临时): 不使用 标准定义的变量,  for i in $(ls /etc) 这里 i 表示 : for 循环中每次的循环中的临时变量 离开 循环则变量不可用
    # 变量: 读写权限 XXX=xxx;readOnly 只读变量, 定义后不可再对该变量进行修改
    # 变量: 删除变量, 释放 unset XXX 释放后该变量则不可用
    # 变量: 单引号 : 原样输出内容, 双引号: 可以用作拼接模版 *单引号定义单字符就行了,不要用做其他用途
    # 变量 字符串操作: 拼接: 模版 "$xxx1 $xxx2", 获取长度: ${#xxx} / ${#xxx[0]} 提取: ${xxx:startIndex:endIndex}
    # 变量 字符串查询: `expr index "$xxx" aaa` 返回 aaa 中包含 
    # 变量 数组: xxx=(a b c ... z) 长度固定
    # 变量 数组: 长度: ${#arr[@]} / ${#arr[*]}  ( ${#arr[n]}: 先获取到 arr[n] 返回该元素的 长度 )
    # 变量 map: declare -A xxx 和 map 使用方法相同
    # 变量 数组/map: 删除 元素 unset arr[index]
    # 内建命令: declare 和 typeset(已经被禁用)
    #   -f
    #   -F
    #   -g
    #   -p
    #   -a 数组 普通数组
    #   -A 数组 关联数组支持索引为字符串
    #   -i 定义变量为整数型
    #   -r
    #   -x
    # 注释: 单行 # 多行 :<<name xxxx name (name 为任意字符 可以多个)

    # 参数: 不用定义 根据位置获取: shell param1 param2 ... paramN 脚本中(函数中) 从 $1 开始 拿参数 $0 是脚本名称(函数名称) 基本没啥用 第 10 个开始 必须使用标准获取  ${index} 方式
    # 参数: 
    #   $# : 总共参数的个数, 
    #   $* : 等价于 "$1 $2 ... ${n}" 注意* 没有 $0, 变成单个变量
    #   $$ : 脚本运行的当前进程的 ID,
    #   $! : 后台运行的最后一个进程的 ID 
    #   $@ : 等价于 "$1 $2 ... ${n}" , 变成 有 n 个元素的 数组
    #   $- : 显示 shell 使用的 当前选项, 于 set 命令相同功能
    #   $? : 显示最后命令的退出状态, 0 表示没有错误 正常结束

    # ((表达式))
    # 运算符: shell 不支持简单的数学运算, 使用其他命令 awk 和 expr(表达式计算工具)
    # 算数运算符: XXX=`expr $a + $b` 
    # 加: +, 减: -, 乘: *, 除: /, 取余: %, 赋值: =, 相等: ==, 不相等: != 
    # 关系运算符: [ $a -eq $b ]
    #   -eq: 检测两个数是否 相等
    #   -ne: 检测两个数是否 不相等
    #   -gt: 检测左边的数是否 大于 右边的数 类似 >
    #   -lt: 检测左边的数是否 小于 右边的数 类似 <
    #   -ge: 检测左边的数是否 大于等于 右边的数 类似 >=
    #   -le: 检测左边的数是否 小于等于 右边的数 类似 <=
    # 布尔运算符: [ $a != $b ] 用于数字或者 表达式
    #   ! : 非运算
    #   -o : 或运算
    #   -a : 与运算
    # 逻辑运算符:
    #   && : 逻辑 与 AND
    #   || : 逻辑 或 OR
    # 字符串运算符:
    #   = : 检测两个字符串 是否相等
    #   != : 检测两个字符串 是否不相等
    #   -z : 检测字符串长度 是否为 0
    #   -n : 检测字符串长度 是否不为 0
    #   $ : 检测字符串 是否不为空 true: 不为空 -> a != ""
    # 文件测试运算符:
    #   -b : 检测文件 是否 是 块设备文件(存储以“块”为单位数据的设备)
    #   -c : 检测文件 是否 是 字符字符设备文件
    #   -d : 检测文件 是否 是 目录
    #   -f : 检测文件 是否 是 普通文件(不是目录,也不是设备文件)
    #   -g : 检测文件 是否 设置了 SGID 位
    #   -k : 检测文件 是否 设置了 粘卓位 (Sticky Bit)
    #   -p : 检测文件 是否 是 有名管道
    #   -u : 检测文件 是否 设置了 SUID 位
    #   -r : 检测文件 是否 可读
    #   -w : 检测文件 是否 可写
    #   -x : 检测文件 是否 可执行
    #   -s : 检测文件 是否 为空 0kb
    #   -e : 检测文件(目录) 是否存在

    # 输出:
    #   echo :
    #   printf : %s 字符串占位 ; %d 整型占位 ; %c 单个字符占位 ; %f 输出实数 浮点数
    #           %-10s 指 宽度为10 个字符 - 左对齐, 没有默认右对齐 超出 10个全部显示
    #           %-4.2f  4个占位 , 保留两位小数
    #   \a 警告 \b 后退 \c 抑制不显示内容 \f 换页 \r 回车 \n 换行 \t 水平制表符 \v 垂直制表符 \\ 单个 \

    # 流程控制:
    # if else  没有执行语句的时候 不需要写 else
    # if []
    # then
    #   command 
    # elif [] 
    # then
    #   command 
    # else
    #   command
    # fi
    # ---------
    # for i in [数组]
    # do
    #   commnd $i
    #   ...
    # done
    # ---------
    # while [条件] 没有条件表示无限循环
    # do
    #   command...
    # done
    # ---------
    # unitl [条件]
    # do
    #   command...
    # done
    # ---------
    # case esac : switch
    # case value in
    # a )
    #   command...
    #   ;;
    # b )
    #   command...
    #   ;;
    # esac
    # ---------
    # break(跳出整个循环) & continue(跳出当前这次循环)


    # test 命令

    # 函数
    # function XXX(){} 不用写参数, 使用  $1 $2 ... $n 获取入参 
    # return 在 函数执行完成后 使用 $? 获取返回值 需要立即执行获取, 不然会被覆盖

    # 输入/输出 重定向


    echo "$*"
    echo "$@"
}

# 只识别 $1 输出 命令版本信息 
function _version_info(){
    case $1 in
    "git")
    echo "$(git --version)"
    ;;
    "java")
    echo "$(java --version)"
    ;;
    "ruby")
    echo "$(ruby --version)"
    ;;
    "python3")
    echo "$(python3 --version)"
    ;;
    "pip3")
    echo "$(pip3 --version)"
    ;;
    "brew")
    echo "$(brew -v)"
    ;;
    "pod")
    echo "$(pod --version)"
    ;;
    "xcodebuild")
    echo "$(xcodebuild -v)"
    ;;
    "gradle")
    echo "$(gradle  --version)"
    ;;
    "adb")
    echo "$(adb --version)"
    ;;
    "lqkfn")
    echo "$(lqkfn --version)"
    ;;
    *)
    echo "未知命令"
    ;;
    esac
}

# 判断软件是否安装
# 例: check_app brew
function check_app(){
    # "\033[字背景;字颜色m $内容 \033[0m"
    # 字颜色 30 -> 37 黑红绿黄蓝紫 天蓝 白
    # 字背景 40 -> 47 黑红绿黄蓝紫 天蓝 白

    if ! type $1 >/dev/null 2>&1; then
        echo -e "\033[31m[ $1 ] 未安装\033[0m"
    else 
        echo -e "\033[32m[ $1 ] 已经安装\033[0m"
        _version_info $1
    fi
}

# 输入内容 并判断
function switch(){
    # 读取输入
    read PLATFROM
    case $PLATFROM in
    "1")
    echo "你选择了创建 Flutter 工程"
    ;;
    "2")
    echo "你选择了创建 Android 工程"
    ;;
    "3")
    echo "你选择了创建 iOS 工程"
    ;;
    *)
    echo "你没有选择"
    ;;
    esac
}

# 创建 Fluter & Native (Android & ios)工程
function fnCreate(){
    # --project-name 创建目录 
    workDir=$1
    echo "$(mkdir $workDir)"
    # cd 到 projectName 目录下
    echo "$(cd $workDir)"
    # 创建个 ok.txt 文件
    touch "ok.txt"
    # 创建 flutter 工程
    # flutter creaete --project-name [] --platforms=android,ios -t module -i swift -a kotlin 
}

function initfn(){
    # 在当前目录(空目录)下 初始化工程 (工程名称为文件夹名称)
    # 获取目录 获取工程名称 -> 没有设置工程名称, 则使用当前目录名称作为 工程名称
    echo ""
}

# 解析 传入的参数
function save_params(){
    echo "=========== params ==============="
    # 将所有参数 存放在 map 中
    # 外面已经把所有参数 放入 map 但是传递时依旧会 分开传递 还是需要再次 存入map 才能方便存取
    # shell 传递参数 只能通过位置, 没有名称, 所以需要 用 map 方式 map 需要使用  --key=value 方式传递参数
    echo "$@"
    echo "=================================="
}

# 执行第一个命令, 返回剩余参数
function comd_action(){
    declare -A all_params
    # 循环保存参数
    for i in $@
    do
        # 根据参数 保存值信息
        if [ "$i" = "$1" ]
        then
            # 输出版本信息
            all_params[$i]=$i
        fi
    done
    return $all_params
}

# 使用 source 执行文件时 这个方法 会演变成命令 可以直接执行
function lqkfn(){
    # printf "====================================\n"
    # # 第一个参数 文件名/ 或者函数名 这里是 lqkfn
    # printf "= %-s \n" "执行的文件名: $0 : $1" 
    # printf "====================================\n"
    
    # 定义 map 把输入的参数保存 方便后面进行校验
    declare -A all_params
    # 打印所有入参
    # echo $@
    # 循环保存参数
    for i in $@
    do
        # 根据参数 保存值信息
        # printf "save: %-s \n" "$i"
        all_params[$i]=$i
    done

    # # all_params 大小
    # # echo "all_params: ${#all_params[@} : $#"
    # echo "all_params: ${#all_params[*]} : $#"
    # echo "===== 分隔符 ====="
    # # 输出 参数个数 $# 和 all_params
    # echo "${#all_params[@]}"
    
    if [ "$#" = "0" ]
    then
        echo "not have params"
        return
    fi

    # # 遍历 all_params 并输出
    # for i in ${all_params[*]}
    # do
    #     echo "all_params: " ${all_params[$i]}
    # done

    # 获取第一个参数
    comd1=$1

    # # all_params 是传递进来的所有参数
    # save_params ${all_params[*]}

    # 删除变量
    unset all_params[$comd1]

    # # 查看删除结果
    # save_params ${!all_params[*]}

    if [ "$comd1" = "--version" ]
    then
        # 输出版本信息
        echo "$version"
    elif [ "$comd1" = "--help" ]
    then
        # 输出帮助
        fnHelp
    elif [ "$comd1" = "create" ]
    then
        # 创建工程 -> 将所有参数 传递下去
        fnCreate $all_params
    elif [ "$comd1" = "doctor" ]
    then
        # 检查所有软件是否安装
        for i in ${app_list[*]}
        do
            check_app $i
        done
    fi

    
}
